//
//  main.m
//  OCDay2
//
//  Created by dllo on 16/5/23.
//  Copyright © 2016年 lanou. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
#import "Subject.h"
#import "Car.h"
#import "Book.h"

#pragma mark - 知识点1 继承
void chapterOfExtend() {
    
    /**
     *1. 面向对象三大特性:封装,继承,多态
     *2. 继承具有单向性,不能相互继承.
     *3. 同一个类不可以继承多个父类,一个类只有一个父类,可以有多个子类.
     *4. 子类可以继承父类全部的实例变量和方法.
     *5. 子类可以重写父类的方法.
     *6. 父类里面是公有的实例变量和方法,子类里是特有的实例变量和方法.
     *7. 没有父类的类是根类,OC中最常见的根类是NSObject.还有一个是NSProxy.
     *8. 既可以保证类的完整性,也可以简化代码.
     */
    
    
//    Person *per1 = [[Person alloc] init];
//    per1.name = @"司昌宝";
//    per1.address = @"瓦房店市";
//    per1.age = 22;
//    
//    
    Student *stu = [[Student alloc] init];
    stu.name = @"司昌宝";
//    stu.score = 57.5f;
    [stu setAddress:@"大连市"];
    [stu setAge:22];
    [stu setNumber:16050819];
    
//
//    
//    
//    NSLog(@"%@ %@ %ld %ld %lf",stu.name,stu.address,stu.age,stu.number,stu.score);
}

#pragma mark - 知识点2 自定义初始化 和 便利构造器
void chapterOfInit() {
    
    Car *car = [Car carWithPrice:800000 withName:@"捷达" withNumber:@"辽B78978"];
    //不允许对对象进行两次初始化.
    NSLog(@"调用成功");
}
int main(int argc, const char * argv[]) {
    @autoreleasepool {
//        Student *stu = [[Student alloc] init];
//        stu->_name = @"老黑";
//        stu->_number = 55;
//        Subject *sub = [[Subject alloc] init];
//        sub->_math = 56.5;
//        sub->_chinese = 80;
//        sub->_english = 99;
//        
//        [stu setSub:sub];
//        
//        [stu info];
        
 //       chapterOfInit();
        
        Book *b2 = [Book bookWithName:@"老人与海" withPrice:20 withAuthor:@"海明威"];
        [b2 setName:@"老人与海2???"];
        
        //点语法使用
        // . 代表setter方法
        b2.name = @"丧钟为谁而鸣";
        // . 代表getter方法
        NSLog(@"%@",b2.name);
        
        b2.stu = [[Student alloc] init];
        b2.stu.name = @"司昌宝";
        
        
        [b2 myPrint];
        
        
        
        
    }
    
    
    
    
    
    
    return 0;
}
